package com.zzti.pay.wechat.pay;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.zzti.pay.service.MyBusiness;
import com.zzti.pay.service.OwnBusiness;

@Component
public class H5Pay {
	@Autowired
	WXPay wxPay;

	// 创建订单
	public Map<String, String> createOrder(String outTradeNo, String totalFee, String body, String IP) {
		Map<String, String> scene_info = new HashMap<>();
		scene_info.put("type", "Wap");
		scene_info.put("wap_url", "网站地址");
		scene_info.put("wap_name", "网站名");
		// 封装数据
		Map<String, String> map = new HashMap<>();
		map.put("body", body); // 商品描述
		map.put("out_trade_no", outTradeNo); // 商户订单号
		map.put("total_fee", totalFee); // 订单总金额，单位为分
		map.put("spbill_create_ip", IP); // 终端IP
		map.put("notify_url", WeChatConfig.NOTIFY_URL); // 通知地址
		map.put("trade_type", "MWEB"); // H5支付的交易类型为MWEB
		map.put("scene_info", JSON.toJSONString(scene_info)); // 场景类型
		return map;
	}

	// 调起支付 返回给前端url
	public String toPay(Map<String, String> data) {
		try {
			Map<String, String> data2 = wxPay.fillRequestData(data);
			// 调官方sdk统一下单方法
			Map<String, String> result = wxPay.unifiedOrder(data2);
			// 验证返回数据
			if ("SUCCESS".equals(result.get("return_code")) && "SUCCESS".equals(result.get("result_code"))) {
				// String prepay_id = result.get("prepay_id"); // 预支付交易会话标识
				// 有效期两小时
				// String trade_type = result.get("trade_type"); // 交易类型
				String mweb_url = result.get("mweb_url"); // 支付跳转链接
				return mweb_url;
			}

		} catch (Exception e) {
			// 记录日志
			e.printStackTrace();
		}
		return null;
	}

	// 微信异步通知方法
	public String notify(Map<String, String> responseData) {

		String return_code = responseData.get("return_code"); // 业务结果(SUCCESS/FAIL)
		if ("SUCCESS".equals(return_code)) {

//			String return_msg = responseData.get("return_msg");
//			String appid = responseData.get("appid"); // 公众账号ID
//			String mch_id = responseData.get("mch_id"); // 商户号
//			String nonce_str = responseData.get("nonce_str"); // 随机字符串
//			String sign = responseData.get("sign"); // 签名
//			String sign_type = responseData.get("sign_type"); // 签名类型（非必填项）
//			String openid = responseData.get("openid"); // 用户标识
//			String is_subscribe = responseData.get("is_subscribe"); // 是否关注公众账号
//			String trade_type = responseData.get("trade_type"); // 交易类型
//			String bank_type = responseData.get("bank_type"); // 付款银行
//			String total_fee = responseData.get("total_fee"); // 订单总金额，单位为分
//			String cash_fee = responseData.get("cash_fee"); // 现金支付金额
//			String transaction_id = responseData.get("transaction_id"); // 微信支付订单号
//			String out_trade_no = responseData.get("out_trade_no"); // 商户订单号
//			String time_end = responseData.get("time_end"); // 支付完成时间，格式为yyyyMMddHHmmss
			// 验证签名是否正确
			try {
				boolean isSignValid = wxPay.isPayResultNotifySignatureValid(responseData);
				if (!isSignValid) {
					return "";
				}

				// 验证该订单是否已经处理
				// 验证金额是否正确
				// 如果都成功，更新订单表
				OwnBusiness own = new MyBusiness();
				boolean isSuccess = own.myBusiness(responseData, "wechat");
				if (!isSuccess) {
					return "";
				}

				Map<String, String> map = new HashMap<>();
				map.put("return_code", "SUCCESS");
				map.put("return_msg", "OK");

				return WXPayUtil.mapToXml(map);
			} catch (Exception e) {
				// 记录日志 map转换成xml数据出异常了
				e.printStackTrace();
			}
		}
		return "";
	}

}
